package cn.jolyoulu.cmnservice.serivce;


import cn.jolyoulu.cmnservice.entity.po.SysMenu;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.jolyoulu.cmnservice.entity.dto.AddMenuDTO;
import cn.jolyoulu.cmnservice.entity.dto.TreeDTO;

import java.util.List;
import java.util.Set;
import java.util.function.Function;

public interface SysMenuService extends IService<SysMenu> {

    /**
     * 根据角色id获取权限菜单
     * @param roleId
     * @return
     */
    Set<String> selectPermissionMenuByRoleId(String roleId);

    /**
     * 根据父级id获取数据
     * @return
     */
    List<SysMenu> selectByParentId(String parentId);

    /**
     * 获取树结构菜单
     * @param parentId 父节点
     * @param format 格式化
     * @return
     */
    <R extends TreeDTO<R>> List<R> selectTree(String parentId, Function<SysMenu, R> format);

    /**
     * 获取用户树结构菜单
     * @param roles 角色，可多个
     * @param format 格式化
     * @return
     */
    <R extends TreeDTO<R>> List<R> selectRolesMenuTree(Set<String> roles, String parentId, Function<SysMenu, R> format);

    /**
     * 添加子菜单
     * @param dto
     * @return
     */
    Boolean addLeafMenu(AddMenuDTO dto);


    /**
     * 添加根菜单
     * @param dto
     * @return
     */
    Boolean addRootMenu(AddMenuDTO dto);

    /**
     * 变换父节点
     * @param id 菜单id
     * @param newParentId 新节点id
     */
    void updateParent(String id, String newParentId);

    /**
     * 重新关联当前节点树下所有节点的父节点信息
     * @param id 菜单id
     */
    void updateChildParent(String id);

    /***
     * 合计当前节点下的菜单
     * @param
     */
    Integer countByParentId(String parentId);

    /**
     * 删除菜单
     */
    void delById(String id);

    /**
     * 根据角色父级id获取数据
     * @param roleIds
     * @param parentId
     * @return
     */
    List<SysMenu> selectByRolesAndParentId(Set<String> roleIds, String parentId);

    /**
     * 根据角色父级id获取数据
     * @param roleId
     * @param parentId
     * @return
     */
    List<SysMenu> selectByRolesAndLikeParentIds(String roleId, String parentId);

    /**
     * 获取角色有的菜单id
     * @param roleId
     * @return
     */
    List<String> selectIdByRoleId(String roleId);
}